package com.day17;

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;

/**
 * 一.说明:java中的对象，正常情况下，只能进行比较:==或 !=,不能使用>或<的
 * 但是在开发的场景中，我又需要对多个对象进行排序。
 * 如何实现呢?需要使用两个接口中的任何一个:Comparable或Comparator
 * <p>
 * 二.Comparable接口的使用
 */
public class CompareTest {


    /**
     * Comparator接口的使用:定制排序
     * 1.背景:
     * 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码或者实现了java.lang.Comparable接口的排序规则
     * 不适合当前的操作，那么可以考虑使用Comparator的对象来排序。
     * 2.重写compare(Object o1, Object o2)方法，比较o1和o2的大小:
     * 如果方法返回正整数，则表示o1大于o2;
     * 如果返回0，表示相等
     * 如果返回负整数,表示o1小于o2
     */
    @Test
    public void test3() {
        String[] strings = {"AA", "CC", "MM", "GG"};

        Arrays.sort(strings, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if (o1 instanceof String && o2 instanceof String) {
                    return -o1.compareTo(o2);
                }
                throw new RuntimeException("输入的数据类型不一致");
            }
        });
        System.out.println(Arrays.toString(strings));
    }


    @Test
    public void test2() {
        Goods[] arr = new Goods[2];
        arr[0] = new Goods("lenvo", 12);
        arr[1] = new Goods("lenvo", 14);
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }


    /**
     * Comparable接口的使用举例:
     * <p>
     * 1.像String,包装类等实现了Comparable接口，重写了compareTo()方法，给出了比较两个对象大小的方式
     * 2.重写compareTo()的规则:
     * 如果当前对象this大于形参对象obj,则返回正整数，
     * 如果当前对象this小于形参对象obj,则返回负整数，
     * 如果当前对象this等于形参对象obj,则返回零。
     * 3.像String,包装类重写compareTo()方法以后，进行了从小到大的排列。
     * <p>
     * 4.对于自定义类来说，如果需要排序，我们可以让自定义类实现Comparable接口，重写compareTo()方法
     */
    @Test
    public void test1() {
        String[] strings = {"AA", "CC", "MM", "GG"};

        Arrays.sort(strings);

        System.out.println(Arrays.toString(strings));
    }
}
